#ifndef __MY_CONFIG__
#define __MY_CONFIG__ 
#include<mutex>
#include"util.hpp"

namespace cloud 
{
#define CONFIG_FILE "./cloud.conf" 
    class Config 
    {
    private: 
        Config() 
        {
            ReadConfigFile(); 
        }
        static Config *_instance;
        static std::mutex _mutex; 
    private:
        int _hot_time;
        int _server_port;
        std::string _server_ip;
        std::string _download_prefix;
        std::string _packfile_suffix;
        std::string _pack_dir;
        std::string _back_dir;
        std::string _backup_file; 
        bool ReadConfigFile() 
        {
            FileUtil fu(CONFIG_FILE);
            std::string body;
            if(fu.GetContent(&body) == false) 
            {
                std::cout << "load config file failed!\n";
                return false; 
            }
            Json::Value root;
            if(JsonUtil::UnSerialize(body, &root) == false) 
            {
                std::cout << "parse config file failed!\n";
                return false; 
            }
            _hot_time = root["hot_time"].asInt();
            _server_port = root["server_port"].asInt();
            _server_ip = root["server_ip"].asString();
            _download_prefix = root["download_prefix"].asString();
            _packfile_suffix = root["packfile_suffix"].asStrign();
            _pack_dir = root["pack_dir"].asString();
            _backup_file = root["backup_file"].asString(); 
            return true; 
        }
    public:
        static Config *GetInstance()
        {
            if(_instance == NULL) 
            {
                _mutex.lock();
                if(_instance == NULL) 
                {
                    _instance = new Config(); 
                }
                _mutex.unlock(); 
            }
            return _instance;

        }
        int GetHotTime()
        {
            return _hot_time; 
        }

        int GetServerPort()
        {
            return _server_port; 
        }

        std::string GetServerIp()
        {
            return _server_ip; 
        }

        std::string GetDownloadPrefix()
        {
            return _download_prefix; 
        }

        std::string GetPackFileSuffix() 
        {
            return _packfile_suffix; 
        }

        std::string GetPackDir() 
        {
            return _pack_dir; 
        }

        std::string GetBackDir() 
        {
            return _back_dir; 
        }

        std::string GetBackupFile() 
        {
            return _backup_file; 
        }

    };

    Config *Config::_instance = NULL; 
    std::mutex Config::_mutex; 
}

#endif 
